package com.water.camera.adapter;

import android.content.Context;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.water.camera.App;
import com.water.camera.databinding.MarkListItemBinding;
import com.water.camera.it.WaterMarkChangeListener;
import com.water.camera.mark.BaseMark;
import com.water.camera.util.Utils;

import java.util.ArrayList;
import java.util.List;

public class MarkListAdapter extends RecyclerView.Adapter {

    int current = -1;
    final int W, H;
    WaterMarkChangeListener fragment;
    List<Integer> list = new ArrayList<>();

    public MarkListAdapter(int index, WaterMarkChangeListener fragment) {
        this.fragment = fragment;
        W = (Utils.getScreenWidth() - Utils.dp2Px(App.getApp(), 30)) / 2;
        H = (int) (0.66 * W);
        if (index == 0) {
            list.add(1);
            list.add(2);
            list.add(3);
            list.add(5);
            list.add(6);
            list.add(7);
            list.add(8);
            list.add(11);
            for (int i = 14; i < 26; i++) {
                list.add(i);
            }
            for (int i = 27; i < 50; i++) {
                list.add(i);
            }
            for (int i = 55; i < 94; i++) {
                list.add(i);
            }
            for (int i = 96; i < 101; i++) {
                list.add(i);
            }
        } else if (index == 1) {
            list.add(11);
            list.add(16);
            list.add(17);
            list.add(18);
            list.add(21);
            list.add(22);
            list.add(27);
            list.add(30);
            list.add(32);
            list.add(33);
            list.add(35);
            list.add(37);
            list.add(42);
            list.add(43);
            list.add(44);
            list.add(47);
            list.add(48);
            list.add(49);
            list.add(55);
            list.add(56);
            list.add(58);
            list.add(73);
            list.add(82);
            list.add(93);
        } else if (index == 2) {
            list.add(1);
            list.add(15);
            list.add(57);
            list.add(60);
            list.add(62);
            list.add(70);
            list.add(76);
            list.add(81);
            list.add(89);
        } else if (index == 3) {
            list.add(3);
            list.add(7);
            list.add(20);
            list.add(23);
            list.add(24);
            list.add(39);
            list.add(41);
            list.add(61);
            list.add(65);
            list.add(67);
            list.add(68);
            list.add(72);
            list.add(78);
            list.add(79);
            list.add(91);
            list.add(92);
        } else if (index == 4) {
            list.add(2);
            list.add(19);
            list.add(69);
            list.add(75);
            list.add(80);
            for (int i = 83; i < 88; i++) {
                list.add(i);
            }
            list.add(90);
            list.add(96);
        } else if (index == 5) {
            list.add(5);
            list.add(6);
            list.add(8);
            list.add(64);
            list.add(71);
        } else {
            for (int i = 97; i < 101; i++) {
                list.add(i);
            }
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        MarkListItemBinding binding = MarkListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        ((ViewHolder) holder).bind(position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        MarkListItemBinding binding;

        public ViewHolder(MarkListItemBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        void bind(int i) {
            int j = list.get(i);
            if (i == current) {
                binding.frame.setSelected(true);
            } else {
                binding.frame.setSelected(false);
            }
            binding.frame.removeAllViews();
            binding.frame.getLayoutParams().width = W;
            binding.frame.getLayoutParams().height = H;
            try {
                BaseMark view = (BaseMark) Class.forName("com.water.camera.mark.Mark" + j).getDeclaredConstructor(Context.class)
                        .newInstance(binding.frame.getContext());
                ImageView img = new ImageView(binding.frame.getContext());
                img.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                img.setImageBitmap(Utils.convertViewToBitmap2(view));
//                view.measure(View.MeasureSpec.makeMeasureSpec(0,
//                        View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
//                        .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//                int w = view.getMeasuredWidth();
//                int h = view.getMeasuredHeight();
//                if (w > 0) {
//                    float scale = W * .8f / w;
//                    if (h * scale > H) {
//                        scale = H * .8f / h;
//                    }
//                    view.setScaleX(scale);
//                    view.setScaleY(scale);
//                }
                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (0.8 * W), (int) (0.8 * H));
                params.gravity = Gravity.CENTER;
                binding.frame.addView(img, params);
            } catch (Throwable e) {
                e.printStackTrace();
                int id = Utils.getLayoutByName("layout_watermark_" + j);
                LayoutInflater.from(binding.frame.getContext()).inflate(id, binding.frame, true);
            }
            binding.index.setText(j + "");
            binding.name.setText(j + "");
            itemView.setOnClickListener(v -> {
                if (getBindingAdapterPosition() != current) {
                    int tmp = current;
                    current = getBindingAdapterPosition();
                    notifyItemChanged(tmp);
                    notifyItemChanged(current);
                }
                fragment.onWaterMarkChange("com.water.camera.mark.Mark" + j);
            });
        }
    }
}
